In the FIBA 3x3's statistician manual, possessions are defined as
... the number of times a team had the ball in its control and produced one of the following possession outcomes: one-point field goal attempt (1PTA), two-point field goal attempt (2PTA), a trip to the free-throw line or a turnover (TO). The free throw possessions are calculated by deducting the extra free throw shots (FT-ES) from the total number of free throws attempted (FTA).
The formula for counting the number of possessions for one team in one game is
$$ POS_{FIBA} = 1PTA + 2PTA + FTA - (FT-ES) + TO$$This definition of possessions overcounts the number of times a team actually has control of the ball by not taking into account offensive rebounds and free throws resulting from fouled successful field goal attempts. Furthermore, it is possible for two teams playing against each other to have greatly different number of possessions which is a major difference to how possessions are accounted for in full court basketball.
Consider this example where team A controls possession of the ball for the entire game by missing all $k$ shots and getting all $k$ possible offensive rebounds where $k$ is an arbitrary positive integer. Team B will end the game with $0$ possessions while team A will have had $k$ possessions. Common sense should dictate that both teams have within +/- 1 the number of possessions from each other.
An alternative approach to count the number of possessions in a game would be to count the number of times a team is able to obtain the ball as a result of the other team making a shot withing the arc (1PTM), making a shot outside the arc (2PTM), making a free throw (FTM) minus made free throws from extra free throw shots (FT-ES), missing a shot (DREB) or a turnover (TO).
$$POS_{alternative} = 1PTM_{opp} + 2PTM_{opp} + FTM_{opp} - FTM_{FT-ES_{opp}} + TO_{opp} + DREB_{self} $$
This is possible to compute from play-by-play data and box scores if FT-ES are included. Ideally, both teams in a game should have within +/- 1 the number of possessions from each other using this approach. A comparison of FIBA's defintion of possession and the aforementioned alternative is presented below for three games in which the number of possessions for each team is determined from the play-by-play.
| Team A | Team B | Team A # Possessions | Team B # Possessions | Team A # Possessions (FIBA) | Team B # Possessions (FIBA) | Team A # Possessions (alternate) | Team B # Possessions (alternate) | Game Link | Box score link | |---|---|---|---|---|---|---|---|---|---| | Liman | Jeddah | 28 | 28 | 37 | 34 | 28 | 28 | Link | Lausanne Master 2022 | | Antwerp | Amsterdam | 27 | 26 | 30 | 31 | 26 | 26 | Link | Debrecen Master 2022 | | Ub | Hamburg | 31 | 31 | 40 | 36 | 31 | 31 | Link | Prague Master 2022 |
The number of total possessions in a season from the pro circuit stats can be computed as
$$POS_{alternative} = 1PTM + 2PTM + FTM - FTM_{FT-ES} + TO + DREB $$However, since made free throws from extra shot free throws are not included in the pro circuit stats, an estimation for the number of made free throws from extra shot free throws have to be made using the FT% and number of extra shot free throws.
$$ \begin{align*} POS_{estimate} &= 1PTM + 2PTM + FTM - [FT\% \times (FT-ES)] + TO + DREB \\ \\ &= 1PTM + 2PTM + FTM \times \left(1 - \frac{FT-ES}{FTA}\right) + TO + DREB \\ \end{align*} $$Per game stats are misleading. Unless the comparison is something such as wins before limit per game (number of wins before the full 10 min) or wins per game (win%), one should normalize team and player stats by possessions before making comparisons. Since FIBA's definition of possessions overcounts the actual number of possessions in a game, the better teams on the world tour which tend to play more games would have more possessions than in reality. Normalizing team and player stats with inflated possession counts will lead to statistical bias and render comparisons using such normalized stats to be inaccurate.
import plotly.express as px
import plotly
plotly.offline.init_notebook_mode()
df = px.data.iris()
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species", size='petal_length', hover_data=['petal_width'])
fig.show()